import { PLATFORM_NAME } from '../plugins/constant'
import store from '../store'
import { hasPermission } from '../store/modules/router'
import { getUserUtils } from '@/common/utils/user'

const { getUser } = getUserUtils(store)

const logoutToLogin = (next, path) => {
  store.dispatch('logout').then(() => {
    next({ path: '/login', query: { redirect: path } })
  })
}

export default {
  // 设置页面的title
  setTitle(to, from, next) {
    if (to.meta.title) {
      document.title = `${to.meta.title} - ${PLATFORM_NAME}`
    }
    next()
  },

  // 权限验证
  authLogin(to, from, next) {
    const user = getUser()
    if (user.userId) {
      // 用store的user.userId值来判断取哪个值做验证
      if (!store.getters.user.userId) {
        // 当token不存在时，重新拉取用户信息
        Promise.all([
          store.dispatch('getMe'),
          store.dispatch('getOrg'),
          store.dispatch('getProvinceMainBusiness'),
        ])
          .then(([user]) => {
            // 根据用户信息生成可访问的路由表
            return store.dispatch('generateRoutes', user)
          })
          .then(() => {
            // 确保addRoutes已完成
            next({ ...to, replace: true })
          })
          .catch(() => {
            // 当获取用户信息失败时，前端登出，不调用接口登出
            logoutToLogin(next, to.fullPath)
          })
      } else {
        if (getPermission(user)) {
          next()
        } else {
          logoutToLogin(next, to.fullPath)
        }
      }
    } else {
      if (to.meta && to.meta.whiteList) {
        // 没有设置权限
        next()
      } else {
        next({ path: '/login', query: { redirect: to.fullPath } })
      }
    }
    function getPermission(user) {
      const userJob = user.job
      const userOrg = user.clientOrgClass
      const scopeArr = user.scopeArr
      // 验证通过的情况：
      // 1、所有路由中，只要有一个路由没匹配通过，就不通过（要求父级路由权限要大于子级路由）
      // 2、当meta中没有配置job和org时，只要登录(store和localStorage中有值)就通过
      // 3、当meta中的job存在userJob，并且org中存在userOrg时通过
      // 权限验证情况还有通过user/me接口验证，当返回错误时，说明没有登录或登录过期
      return to.matched.some(t => hasPermission(userJob, userOrg, scopeArr, t))
    }
  },

  // 判断是否需要记录页码。。。。
  keepTaskRouterStorage(to, from, next) {
    if (!to.matched.some(t => t.meta.keepTaskRouterStorage)) {
      sessionStorage.removeItem('credit_gov_router')
    }
    next()
  },
}
